package com.zx.system.block.mapstruct;


import com.zx.core.context.TenantContextHolder;
import com.zx.core.enums.StatusEnum;
import com.zx.feign.client.dto.DictDataDTO;
import com.zx.system.block.model.SysDictData;
import com.zx.system.block.param.DictDataParam;
import com.zx.system.block.vo.SysDictDataVO;
import org.mapstruct.*;
import org.mapstruct.factory.Mappers;

/**
 * <p>
 * description: 字典数据参数映射 <br>
 * create: 2025-11-18
 * </p>
 *
 * @author zhou xun
 */
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface DictDataMapStructMapper {
    DictDataMapStructMapper INSTANCE = Mappers.getMapper(DictDataMapStructMapper.class);

    /**
     * 将DictDataParam转换为SysDictData实体
     *
     * @param dictDataParam 字典数据参数
     * @return SysDictData实体
     */
    SysDictData dictDataParamToSysDictData(DictDataParam dictDataParam);

    /**
     * 将SysDictData实体转换为SysDictDataVO视图对象
     *
     * @param sysDictData 字典数据实体
     * @return SysDictDataVO视图对象
     */
    SysDictDataVO sysDictDataToSysDictDataVO(SysDictData sysDictData);

    /**
     * 在映射完成后，设置描述性字段
     *
     * @param sysDictData   字典数据实体
     * @param sysDictDataVO 字典数据VO
     */
    @AfterMapping
    default void setDescriptions(SysDictData sysDictData, @MappingTarget SysDictDataVO sysDictDataVO) {
        // 设置状态描述
        Integer status = sysDictData.getStatus();
        StatusEnum statusEnum = StatusEnum.getEnumByCode(status);
        if (statusEnum != null) {
            sysDictDataVO.setStatusDesc(statusEnum.getDesc());
        }
    }

    /**
     * 在映射完成后，设置租户名
     *
     * @param sysDictData   字典数据实体
     * @param sysDictDataVO 字典数据VO
     */
    @AfterMapping
    default void setTenantName(SysDictData sysDictData, @MappingTarget SysDictDataVO sysDictDataVO) {
        sysDictDataVO.setTenantName(TenantContextHolder.getTenantName());
    }

    /**
     * 将SysDictData实体转换为DictDataDTO数据传输对象
     *
     * @param sysDictData 字典数据实体
     * @return DictDataDTO数据传输对象
     */
    @Mapping(target = "statusDesc", source = "status", qualifiedByName = "getStatusDesc")
    DictDataDTO sysDictDataToDictDataDTO(SysDictData sysDictData);

    /**
     * 根据状态码获取状态描述
     *
     * @param statusCode 状态码
     * @return 状态描述
     */
    @Named("getStatusDesc")// 解决record 不可变不能使用后置处理
    default String getStatusDesc(Integer statusCode) {
        StatusEnum statusEnum = StatusEnum.getEnumByCode(statusCode);
        return statusEnum != null ? statusEnum.getDesc() : null;
    }
}